﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using condortravel.operaciones.core.DataModel;
using System.Data.Linq;
using condortravel.operaciones.entities.Entities;

namespace condortravel.operaciones.persistence.operacionesImpl
{
    public class IncidenteOperacionesDAOImpl : condortravel.operaciones.persistence.Impl.GenericDAO<Tb_Incidencia, int>
    {
        #region Customer Methods
        /// <summary>
        /// Obtiene una lista de itinerarios segun criterio de busqueda
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public List<Tb_Incidencia> getListIncidenciaByCriteria(FilterIncidentesCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Agente);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_PaqueteTuristico);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Estado_Incidencia);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_GrupoAsignacion);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_Incidencia>()
                            where
                            ((p.incidente_ID == filter.Incidente && filter.Incidente != 0) || (filter.Incidente == 0)) &&
                            ((p.agente_ID == filter.Agente && filter.Agente != 0) || (filter.Agente == 0)) &&
                            ((p.agencia_ID == filter.Agencia && filter.Agencia != 0) || (filter.Agencia == 0)) &&
                            ((p.paqueteTuristico_ID == filter.Paquete && filter.Paquete != 0) || (filter.Paquete == 0)) &&
                            ((p.estado_Incidencia_ID == filter.Estado && filter.Estado != 0) || (filter.Estado == 0)) &&
                            ((p.pais_ID == filter.Pais && filter.Pais != 0) || (filter.Pais == 0)) &&
                            ((p.ciudad_ID == filter.Ciudad && filter.Ciudad != 0) || (filter.Ciudad == 0)) &&
                            ((p.grupoAsignacion_ID == filter.GrupoAsignado && filter.GrupoAsignado != 0) || (filter.GrupoAsignado == 0)) &&
                            ((p.Tb_Cliente.nombre.Contains(filter.Nombre) && !filter.Nombre.Equals(String.Empty)) || (filter.Nombre.Equals(String.Empty))) &&
                            ((p.Tb_Cliente.apellido.Contains(filter.Apellidos) && !filter.Apellidos.Equals(String.Empty)) || (filter.Apellidos.Equals(String.Empty))) &&
                            ((p.Tb_Cliente.dni.Contains(filter.Dni) && !filter.Dni.Equals(String.Empty)) || (filter.Dni.Equals(String.Empty)))
                            select p).ToList<Tb_Incidencia>();
                }

            }
        }


        public List<Tb_Incidencia> getListIncidenciaByAgent(FilterIncidentesCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Agente);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_PaqueteTuristico);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Estado_Incidencia);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_Incidencia>()
                            where
                            ((p.agente_ID == filter.Agente))                            
                            orderby p.fechaRegistro descending
                            select p).ToList<Tb_Incidencia>();
                }

            }
        }

        #endregion

        #region CRUD
        public override Tb_Incidencia update(Tb_Incidencia entity)
        {
            Tb_Incidencia incidencia;
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    incidencia = dataContext.GetTable<Tb_Incidencia>().Where(p => p.incidente_ID == entity.incidente_ID).Single();
                    incidencia.agente_ID = entity.agente_ID;
                    incidencia.categoria_ID = entity.categoria_ID;
                    incidencia.ciudad_ID = entity.ciudad_ID;
                    incidencia.cliente_ID = entity.cliente_ID;
                    incidencia.descripcionIncidente = entity.descripcionIncidente;
                    incidencia.descripcionSolucion = entity.descripcionSolucion;
                    incidencia.estado_Incidencia_ID = entity.estado_Incidencia_ID;
                    incidencia.fechaAtencion = entity.fechaAtencion;
                    //incidencia.fechaRegistro = entity.fechaRegistro;
                    incidencia.grupoAsignacion_ID = entity.grupoAsignacion_ID;
                    incidencia.pais_ID = entity.pais_ID;
                    incidencia.paqueteTuristico_ID = entity.paqueteTuristico_ID;
                    incidencia.prioridad_ID = entity.prioridad_ID;
                    incidencia.programacion_ID = entity.programacion_ID;
                    incidencia.resultado_ID = entity.resultado_ID;
                    incidencia.tipoProblema_ID = entity.tipoProblema_ID;
                    incidencia.agencia_ID = entity.agencia_ID;
                    incidencia.subcategoria_ID=entity.subcategoria_ID;
                    dataContext.SubmitChanges();
                }
            }
            return incidencia;
        }

        public override Tb_Incidencia getByID(int id)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = new DataContext(this.ConnectionString))
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Agente);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_PaqueteTuristico);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Estado_Incidencia);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_ServiciosProgramado);
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_ItinerarioViajero);
                    dataContext.LoadOptions = options;
                    return (from p in dataContext.GetTable<Tb_Incidencia>()
                            where p.incidente_ID == id
                            select p).SingleOrDefault<Tb_Incidencia>();
                }
            }
        }

        public override void delete(int pk)
        {
            string deleteDetails = string.Format("delete  from Tb_EventoExtraordinario where eventoExt_ID='{0}'", pk);
            this.executeSQL(deleteDetails);
        }
        #endregion
    }
}
